#ifndef _SERVER_H_
#define _SERVER_H_

#include <vector>
#include "csthread.h"

using namespace std;

/************************************************************************/
/* Handles multi thread network clients processing                      */
/************************************************************************/
class Server {

public:
 
	/************************************************************************/
	/* Creates server instance                                              */
	/************************************************************************/
	Server(int port);

	/************************************************************************/
	/* Destroys server instance                                             */
	/************************************************************************/
	virtual ~Server();

	/************************************************************************/
	/* Starts server's clients handling loop                                */
	/************************************************************************/
	virtual bool start();

	/************************************************************************/
	/* Returns pointer to server socket                                     */
	/************************************************************************/
	SocketServer * getServerSocket() const;

	/************************************************************************/
	/* Returns ClientServerThread object by currently connected client      */
	/************************************************************************/
	virtual ClientServerThread * createClientServerThread(SocketClient * client) = 0;

	/************************************************************************/
	/* Returns whether server is works                                      */
	/************************************************************************/
	bool getIsWork() const;

	/************************************************************************/
	/* Force ends server                                                    */
	/************************************************************************/
	virtual void end();

protected:

	/************************************************************************/
	/* Work state of server                                                 */
	/************************************************************************/
	bool isWork;

	/************************************************************************/
	/* Server port                                                          */
	/************************************************************************/
	int port;

	/************************************************************************/
	/* Pointer to server socket                                             */
	/************************************************************************/
	SocketServer * serverSocket;

	/************************************************************************/
	/* Vector with connected clients                                        */
	/************************************************************************/
	vector<SocketClient*> clientsSockets;

	/************************************************************************/
	/* Calls after client accept                                            */
	/************************************************************************/
	virtual void afterClientAccept(SocketClient * client);

private:

	/************************************************************************/
	/* Client - server threads handles                                      */
	/************************************************************************/
	vector<ClientServerThread*> threads;
};

#endif //_SERVER_H_
